extends CharacterBody2D

@export var dialog_lines: Array = ["嗨，我是 NPC。", "按 E 与我对话。"]# 导出变量，允许在编辑器中设置对话内容
@export var dialog_offset: Vector2 = Vector2(0, -50)  # 导出变量，设置对话框相对于NPC的偏移位置
@export var prompt_offset: Vector2 = Vector2(0, -30)  # 导出变量，设置交互提示相对于NPC的偏移位置

var player_in_range: bool = false#定义玩家是否在对话区域内
var can_interact: bool = true#定义玩家是否可以交互，用于防止连续触发对话
var dialog_box: CanvasLayer#存储对话框的实例引用，提供对对话框节点DialogBox.tscn的访问
var interaction_prompt: Node2D#存储交互提示节点的引用，方便在代码中访问提示节点InteractionPrompt.tscn

func _ready() -> void:# 节点准备完成时调用
	var area = $InteractionArea#连接 Area2D 节点的 body_entered 内置信号
	#当信号触发时，调用当前脚本中的 _on_interaction_area_body_entered /exited方法
	area.connect("body_entered", Callable(self, "_on_interaction_area_body_entered"))
	area.connect("body_exited", Callable(self, "_on_interaction_area_body_exited"))
	
	# 实例化对话框
	var dialog_scene = load("res://scenes/DialogBox.tscn")#加载对话框场景资源DialogBox.tscn
	dialog_box = dialog_scene.instantiate()#创建对话框场景的实例
	add_child(dialog_box)#将对话框添加为NPC的子节点
	
	# 设置对话框位置（可选）
	if dialog_box.has_node("Panel"):#检查对话框点是否有名Panel子节点
		var panel = dialog_box.get_node("Panel")#访问Panel节点
		panel.position = dialog_offset#设置Panel的位置
	#加载交互提示InteractionPrompt.tscn	 
	var prompt_scene = load("res://scenes/InteractionPrompt.tscn")
	if prompt_scene:# 检查场景是否成功加载
		interaction_prompt = prompt_scene.instantiate()#创建实例
		add_child(interaction_prompt)#添加交互提示节点
		interaction_prompt.position = prompt_offset#设置提示位置
# 当物体进入交互区域时调用		
func _on_interaction_area_body_entered(body: Node) -> void:
	if body.name == "Player":# 检查进入的是否是玩家
		player_in_range = true
		# 如果有交互提示且对话框未显示，则显示提示
		if interaction_prompt and not dialog_box.panel.visible:
			interaction_prompt.show_prompt()
# 当物体离开交互区域时调用
func _on_interaction_area_body_exited(body: Node) -> void:
	if body.name == "Player":# 检查离开的是否是玩家
		player_in_range = false
		if interaction_prompt:# 如果有交互提示，则隐藏它
			interaction_prompt.hide_prompt()
# 已通过setter方法处理纹理更新，无需_enter_tree()函数



func _process(delta: float) -> void:# 每帧处理函数
	# 检查是否可以开始对话（玩家在范围内且按下交互键且可以交互）
	if player_in_range and Input.is_action_just_pressed("interact") and can_interact:
		can_interact = false# 此时禁用交互以防连续触发
		if interaction_prompt:# 开始对话后隐藏交互提示
			interaction_prompt.hide_prompt()
		dialog_box.show_dialog(dialog_lines)# 显示对话
		var timer = get_tree().create_timer(0.2) # 创建0.2s的一次性计时器
		timer.timeout.connect(func():# 计时器结束后重新启用交互并在适当时显示提示
			can_interact = true
			if player_in_range and not dialog_box.panel.visible:#判断玩家在对话范围内且对话框以关闭
				interaction_prompt.show_prompt()#重新启用提示
			)
		
